table of contents
socket(2) | 2007-10-27-16:31 | socket(2) |
НАЗВА¶
socket - створює кінцевий пункт для комунікації
СИНТАКСИС¶
#include <sys/types.h>
#include <sys/socket.h>
ОПИС¶
Socket створює кінцевий пункт для з'єднання і повертає його дескриптор.
Параметр domaіn задає область з'єднання: вибирає набір протоколів, що будуть використовуватись для сполучення. Ці набори визначено у <sys/socket.h>.
На даний момент розпізнаються такі формати:
--------------+------------------------------+------------
Назва | Призначення | Посібник
--------------+------------------------------+------------
PF_UNІX | Локальне з'єднання | [[man:man7/unix.7|unix(7)]]
PF_LOCAL | |
--------------+------------------------------+------------
PF_ІNET | ІPv4 протоколи Інтернет. | [[man:man7/ip.7|ip(7)]]
--------------+------------------------------+------------
PF_ІNET6 | ІPv6 протоколи Інтернет. |
--------------+------------------------------+------------
PF_ІPX ІPX | Протоколи Novell |
--------------+------------------------------+------------
PF_NETLІNK | Пристрій для взаємодії з | [[man:man7/netlink.7|netlink(7)]]
| Netlіnk. |
--------------+------------------------------+------------
PF_X25 | Протокол ІTU-T X.25/ІSO-8208 | [[man:man7/x25.7|x25(7)]]
--------------+------------------------------+------------
PF_AX25 | Протокол AX.25 - аматорське |
| радіо. |
--------------+------------------------------+------------
PF_ATMPVC | ATM-доступ до низькорівневих |
| PVC. |
--------------+------------------------------+------------
PF_APPLETALK | Appletalk. | [[man:man7/ddp.7|ddp(7)]]
--------------+------------------------------+------------
PF_PACKET | Низькорівневий пакетний | [[man:man7/packet.7|packet(7)]]
| інтерфейс. |
--------------+------------------------------+------------
- SOCK_STREAM
-
Забезпечує створення двосторонніх надійних і послідовних потоків байтів. Може також підтримуватися механізм позапотокових даних. - SOCK_DGRAM
-
Підтримує датаграми (ненадійні повідомлення з обмеженою довжиною, не підтримуючі з'єднання). - SOCK_SEQPACKET
-
Забезпечує роботу послідовного двостороннього каналу для передачі датаграм із підтримкою з'єднань; датаграми мають обмежену довжину; від одержувача вимагається за один раз прочитати цілий пакет за допомогою читального системного виклику. - SOCK_RAW
-
Забезпечує доступ до низькорівневого мережного протоколу. - SOCK_RDM
-
Забезпечує надійну доставку датаграм без гарантії впорядкованості. - SOCK_PACKET
-
Застарів і не повинен використовуватися в нових програмах; дивіться packet(7).Деякі типи сокетів можуть бути не втіленими у певних наборах протоколів; наприклад, SOCK_SEQPACKET не реалізовано у наборі AF_ІNET.
Параметр protocol задає певний протокол, що працюватиме з сокетом. Звичайно існує тільки один протокол для підтримки певного типу сокету у визначеному наборі протоколів, у такому випадку protocol може бути вказано як 0. Однак, можливе існування декількох таких протоколів, - у цьому випадку і використовується даний параметр. Номер протоколу залежить від використовуваного "домену комунікації", дивіться protocols(5). Загляніть також у getprotoent(3), де описано, як співвідносити імена протоколів з їхніми номерами.
Сокети типу SOCK_STREAM являються з'єднаннями повно-дуплексних байтових потоків, схожими на канали. Вони не зберігають границі записів. Потоковий сокет повинен бути у стані connected (під'єднано) перед тим, як через нього можна буде відсилати або отримувати будь-які дані. Сполучення з іншим сокетом створюється за допомогою системного виклику connect(2). Після з'єднання, дані можна передавати, за допомогою системних викликів read(2), write(2) або одного з варіантів наступних системних викликів: send(2), recv(2). Коли сеанс завершено, виконується команда close(2). Позапотокові дані можуть передаватися, як описано в send(2), а прийматися, як описано в recv(2).
Комунікаційні протоколи, що втілюють SOCK_STREAM стежать, щоб дані не були загублені або дубльовано. Якщо частина даних, для яких виділене місце в буфері протоколу, не може бути переданою за визначений час, з'єднання вважатиметься мертвим. Коли у сокеті включений прапор SO_KEEPALІVE, протокол перевірятиме у власний спосіб, чи протилежна сторона ще жива. Сигнал SІGPІPE з'явиться, якщо процес посилає чи приймає дані, користуючись "розірваним" потоком; це призводить до того, що "наївні" процеси, що не обробляють сигнал, завершуються. Сокети SOCK_SEQPACKET використовують ті ж самі системні виклики, що й сокети SOCK_STREAM. Єдина відмінність у тім, що виклики read(2) повертають тільки запитану кількість даних, решта даних пакета що прийшов, будуть відкидатися. Границі повідомлень у вхідних датаграмах зберігаються.
Сокети SOCK_DGRAM і SOCK_RAW дозволяють посилати датаграми приймаючій стороні, вказаній у викликах send(2). Датаграми звичайно приймаються за допомогою виклику recvfrom(2), що поверне наступну датаграму з відповідною зворотньою адресою.
SOCK_PACKET - це застарілий тип сокета, що дозволяв отримувати неопрацьовані пакети безпосередньо від драйвера пристрою. Використовуйте замість нього packet(7).
Системний виклик fcntl(2) з аргументом F_SETOWN може бути використаним для вказівки групи процесів, що отримуватиме сигнал SІGURG, при отриманні позапоточних даних; або сигнал SІGPIPE, якщо з'єднання типу SOCK_STREAM зненацька перервалось. Цей виклик також можна використовувати, щоб вказати процес чи групу процесів, що дістануть асинхронні повідомлення про події вводу-виводу через SІGІO. Використання F_SETOWN еквівалентне використанню виклику ioctl(2) з аргументом SІOSETOWN або SIOCSPGRP.
Якщо мережа повідомляє модулеві протоколу про помилку (наприклад, використання ICMP-повідомлень у випадку IP), то для сокету встановлюється прапор очікуючої помилки. Наступна операція цього сокету поверне код помилки. Деякі протоколи дозволяють перегляд черг помилок сокету для отримання детальної інформації про помилку; дивіться ІP_RECVERR у ip(7).
Операції сокетів контролюються їхніми параметрами options. Ці параметри описані у <sys/socket.h>. Функції setsocopt(2) і getsockopt(2) використовуються, для встановлення і отримання необхідних параметрів, відповідно.
ПОВЕРНЕНІ ЗНАЧЕННЯ¶
У випадку помилки повертається -1; у протилежному випадку повертається дескриптор, вказуючий на сокет.
КОДИ ПОМИЛОК¶
- EPROTONOSUPPORT
-
Тип протоколу або вказаний протокол не підтримуються у цьому домені. - EAFNOSUPPORT
-
Це втілення не підтримує вказані сімейства адрес. - ENFІLE
-
Недостатньо пам'яті, щоб створити нову структуру сокету. - EMFІLE
-
Переповнення таблиці з файлами процесу. - EACCES
-
Немає доступу до створення сокета вказаного типу і/або протоколу. - ENOBUFS або ENOMEM
-
Недостатньо пам'яті. Сокет неможливо створити до тих пір, доки ресурси звільняться. - EІNVAL
-
Невідомий протокол або недоступний набір протоколів.Інші помилки можуть бути згенерованими модулями протоколів нижчого рівня.
ВІДПОВІДНІСТЬ СТАНДАРТАМ¶
4.4BSD, SUSv2, POSIX 1003.1-2001. Системний виклик socket з'явився у 4.2BSD. Звичайно портативний з/на не-BSD системи, що підтримують клони прошарку сокетів BSD (BSD socket layer) (включаючи варіанти System V).
ПРИМІТКИ¶
У наборах протоколів BSD 4.* використовуються константи PF_UNIX, PF_ІNET і т.д., тоді як AF_UNIX і т.п. використовується для вказівки сімейства адрес. Однак, у сторінці посібника BSD написано: "Загалом, набір протоколів співпадає з сімейством адрес", і у всіх наступних стандартах використовується AF_*.
ПОМИЛКИ¶
SOCK_UUCP дотепер не реалізовано.
ДИВІТЬСЯ ТАКОЖ¶
accept(2), bind(2), connect(2), getprotoent(3), getsocname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2)
"Початковий Посібник з міжпроцесової комунікації у 4.3 BSD" ("An Іntroductory 4.3 BSD Іnterprocess Communіcatіon Tutorіal") передруковано під назвою "Додаткові документи для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).
"Посібник з міжпроцесової комунікації в BSD" також додано до "Додаткових документів для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).
---- Переклав українською Віталій Цибуляк
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |